package ar.edu.caece.dns.modelo.utils;

import ar.edu.caece.dns.modelo.registros.NombreDominio;

/**
 * Esta clase toma un nombre de dominio en formato String y devuelve su objeto
 * {@link NombreDominio} correspondiente.
 * 
 * @author Lucas - Jun 22, 2012 7:20:25 PM
 */
public class NombreDominioParser {

	public NombreDominioParser() {
		super();
	}

	/**
	 * Toma el string pasado por parametro y lo subdivide por "."
	 * 
	 * @param cadena
	 *            en formato: ar.edu.caece
	 * @return una instancia de {@link NombreDominio}
	 */
	public NombreDominio parse(String cadena) {
		NombreDominio nd = new NombreDominio(cadena);

		if (cadena.indexOf(".") != -1)
			nd.setEtiquetas(cadena.split("\\."));
		else
			nd.setEtiquetas(new String[] { cadena });

		return nd;
	}

	/**
	 * Obtiene el padre del nombre de dominio pasado por parametro.
	 * 
	 * @param hijo
	 * @return
	 */
	public NombreDominio obtenerPadre(NombreDominio hijo) {
		NombreDominio padre = null;

		if (hijo != null && hijo.getEtiquetas().length > 1) {
			String[] etiquetasPadre = new String[hijo.getEtiquetas().length - 1];
			StringBuffer valor = new StringBuffer("");

			for (int i = 0; i < hijo.getEtiquetas().length - 1; i++) {
				etiquetasPadre[i] = hijo.getEtiquetas()[i];
				valor.append(hijo.getEtiquetas()[i]);

				if (i != hijo.getEtiquetas().length - 2)
					valor.append(".");
			}

			padre = new NombreDominio();
			padre.setEtiquetas(etiquetasPadre);
			padre.setValor(valor.toString());
		}

		return padre;
	}
	
	public NombreDominio obtenerSubdominio(NombreDominio nombreDominio, int parteInicial, int parteFinal) {
		NombreDominio nombreDominioResultante = null;
		String cadena = "";
		// Subdominio invertido
		if (parteInicial > parteFinal) {
			for (int i = parteInicial; i >= parteFinal; i--) {
				if (i == parteInicial)
					cadena = nombreDominio.get(i - 1);
				else
					cadena = cadena + "." + nombreDominio.get(i - 1);
			}
		} else { // Subdominio normal (sin invertir)
			if (parteInicial < parteFinal) {
				for (int i = parteInicial; i <= parteFinal; i++) {
					if (i == parteInicial)
						cadena = nombreDominio.get(i - 1);
					else
						cadena = cadena + "." + nombreDominio.get(i - 1);
				}
			} else { // Solo una parte del dominio
				cadena = nombreDominio.get(parteInicial - 1);
			}
		}
		nombreDominioResultante = parse(cadena);
		return nombreDominioResultante;
	}
}
